package com.atguigu.tingshu.album.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.List;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;

    @Autowired
    private AlbumAttributeValueMapper albumAttributeValueMapper;

    @Autowired
    private AlbumStatMapper albumStatMapper;

    /**
     * 保存专辑信息
     * @param albumInfoVo
     * @param userId
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveAblumInfo(AlbumInfoVo albumInfoVo, Long userId) {
        //1.保存专辑基本信息 用到工具类BeanUtil
        AlbumInfo albumInfo = BeanUtil.copyProperties(albumInfoVo, AlbumInfo.class);
        //从本地线程中获取用户id 因为本地线程目前暂未实现 所以先写死
        albumInfo.setUserId(userId);
        albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
        albumInfoMapper.insert(albumInfo);

        //2.保存专辑标签信息
        List<AlbumAttributeValue> albumAttributeValueList = albumInfo.getAlbumAttributeValueVoList();
        if(albumAttributeValueList.isEmpty()){
            throw new GuiguException(400,"专辑信息不完整，没有属性信息");
        }
        for (AlbumAttributeValue albumAttributeValue : albumAttributeValueList) {
            albumAttributeValue.setAlbumId(albumInfo.getId());
            albumAttributeValueMapper.insert(albumAttributeValue);
        }

        //3.保存专辑统计信息 因为统计类型有四种 所以把方法提取出来 然后在这里直接调用
        this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_PLAY,0);
        this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_SUBSCRIBE,0);
        this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_BUY,0);
        this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_COMMENT,0);

    }



    public void saveAlbumStat(Long albumId,String statType,int statNum){
        AlbumStat albumStat = new AlbumStat();
        albumStat.setAlbumId(albumId);
        albumStat.setStatType(statType);
        albumStat.setStatNum(statNum);
        albumStatMapper.insert(albumStat);
    }


    /**
     * 分页查看专辑信息
     * @param pageInfo
     * @param albumInfoQuery
     * @return
     */
    @Override
    public Page<AlbumListVo> getUserAlbumPage(Page<AlbumListVo> pageInfo, AlbumInfoQuery albumInfoQuery) {

        return albumInfoMapper.selectUserAlbumPage(pageInfo,albumInfoQuery);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteAlbumInfo(Long id) {
        //1.根据id删除专辑信息
        //删除专辑信息需要先判断是否有声音信息未删除
        AlbumInfo albumInfo = albumInfoMapper.selectById(id);
        Integer includeTrackCount = albumInfo.getIncludeTrackCount();
        if (includeTrackCount>0){
            throw new GuiguException(400,"该专辑下有声音，请先删除声音信息");
        }
        albumInfoMapper.deleteById(id);
        //2.根据专辑id删除专辑标签信息
        QueryWrapper<AlbumAttributeValue>queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("album_id",id);
        albumAttributeValueMapper.delete(queryWrapper);

        //3.根据专辑id删除专辑统计信息
        QueryWrapper<AlbumStat>queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.eq("album_id",id);
        albumStatMapper.delete(queryWrapper1);

    }

    /**
     * 修改数据前需要进行数据回显 回显的数据包括album_info album_attribute_value
     * 因为album_info实体类中包含了标签的集合属性 所以返回值类型只要album_info就行
     * @param id
     * @return
     */
    @Override
    public AlbumInfo getAlbumInfo(Long id) {
        //1.查询专辑基本信息
        AlbumInfo albumInfo = albumInfoMapper.selectById(id);


        //2.查询专辑标签信息
        QueryWrapper<AlbumAttributeValue>queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("album_id",id);
        List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueMapper.selectList(queryWrapper);
        if (albumInfo != null){
            albumInfo.setAlbumAttributeValueVoList(albumAttributeValueList);
        }


        return albumInfo;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateAlbumInfo(Long id,AlbumInfoVo albumInfoVo) {
        //1.更新专辑基本信息
        AlbumInfo albumInfo = BeanUtil.copyProperties(albumInfoVo, AlbumInfo.class);
        albumInfo.setId(id);
        albumInfo.setUpdateTime(new Date());
        albumInfoMapper.updateById(albumInfo);
        //2.更新专辑标签信息 因为有多个标签 所以更新思路是先删除 然后重新插入
        //2.1 删除原有专辑标签信息
        QueryWrapper<AlbumAttributeValue>queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("album_id",id);
        albumAttributeValueMapper.delete(queryWrapper);
        //2.2 根据前端传入的数据重新添加标签信息
        List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
        for (AlbumAttributeValueVo albumAttributeValueVo : albumAttributeValueVoList) {
            AlbumAttributeValue albumAttributeValue = BeanUtil.copyProperties(albumAttributeValueVo, AlbumAttributeValue.class);
            albumAttributeValue.setAlbumId(albumInfo.getId());
            albumAttributeValueMapper.insert(albumAttributeValue);

        }

    }

    @Override
    public List<AlbumInfo> getUserAllAlbumList(Long userId) {
        //根据用户id获取最近添加的20条专辑信息
        //sql语句如下：select id,album_title from album_info where user_id = 1 order by id desc limit 20
        QueryWrapper<AlbumInfo>queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id",userId);
        queryWrapper.select("id","album_title");
        queryWrapper.orderByDesc("id");
        //字符串拼接 所以前后加空格
        queryWrapper.last(" limit 20 ");
        List<AlbumInfo> albumInfoList = albumInfoMapper.selectList(queryWrapper);


        return albumInfoList;
    }

}
